#include "stdio.h"
/*
    unistd.h头文件主要用于与POSIX标准相关的系统调用和函数，
    POSIX（Portable Operating System Interface for Unix）是一组定义了UNIX-like操作系统接口标准的规范，
    旨在增加移植性和兼容性。
*/
#include "unistd.h"
/*
    sys/types.h是Unix/Linux系统的基本系统数据类型的头文件，含有size_t，time_t，pid_t等类型。 
*/
#include "sys/types.h"
/*文件状态头文件*/
#include "sys/stat.h"
/*fcntl.h是C语言中的一个头文件，它定义了许多系统调用函数，这些函数用于对文件描述符进行控制。这些函数提供了一些不同的功能，包括打开和关闭文件，锁定文件，以及更改文件的访问模式等等。*/
#include "fcntl.h"
/*即standard library标准库头文件。stdlib.h里面定义了五种类型、一些宏和通用工具函数*/
#include "stdlib.h"
/*文件定义了一个变量类型、一个宏和各种操作字符数组的函数。*/
#include "string.h"
static char user_data[] = {"user data"};
int main(int argc,char**argv)
{
    int fd = -1;
    int ret = -1;
    char *filename  = NULL;
    char readbuf[100] = "";
    char writebuf[100] = "";
    if(argc != 3)
    {
        printf("Error Usage!\r\n");
        return -1;
    }
    filename = argv[1];
    /*打开驱动文件*/
    fd = open(filename,O_RDWR);
    if(fd < 0)
    {
        printf("can`t open file %s\r\n",filename);
    }
    /*从驱动文件读取数据*/
    if(atoi(argv[2]) == 1)
    {   
        int len = 50;
        ret = read(fd,readbuf, len);
        if(ret < 0)
        {
            printf("read file %s failed!\r\n",filename);
        }
        else
        {
            printf("read file %s ok!,and readbuf is %s!",filename,readbuf);
        }
    }

    /*向设备驱动写入数据*/
    if(atoi(argv[2]) == 2)
    {   
        int len = 50;
        memcpy(writebuf,user_data,sizeof(user_data));
        ret = write(fd,writebuf,len);
        if(ret < 0)
        {
            printf("write file %s failed!\r\n",filename);
        }
        else
        {
            printf("write file %s ok!\r\n",filename);
        }
    }
    /*关闭设备*/
    ret  = close(fd);
    if(ret < 0)
    {
        printf("Can`t close file %s\r\n",filename);
        return -1;
    }
    return 0;
}


/*mknod /dev/character_device_drive c 200 0*/
/*使用方法 ./character_base_app /dev/vser 1*/